package com.example.tk2_2;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutput;
import java.io.IOException;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit;//用于引用IP地址编辑框
    EditText ip_port;//用于引用端口号编辑框
    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮
    EditText edit_rq;  //燃气浓度值编辑框
    EditText edit_co; //CO浓度值编辑框
    EditText edit_yj; //泄露预警编辑框
    Socket ss;//网络通信使用的Socket
    DataInputStream dataInputStream; //网络通信使用的数据输入流
    String ip;//用于存储IP地址
    int port; //用于存储端口号
    byte buff[]=new byte[10];//定义一个缓冲区，用于保存网络接收数据
    int len=0; //保存接收的数据包长度
    double data; //保存接收的数据包长度

    int  rq=0;  //接收的燃气浓度
    int  co=0;   //接收的CO浓度
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_state= (TextView)this.findViewById(R.id.tv_state);

        //任务3_1 ： 根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存
        ip_edit=(EditText)this.findViewById(R.id.ip_edit);

        //结束任务3_1
        ip_port= (EditText)this.findViewById(R.id.ip_port);
        bt_connect= (Button)this.findViewById(R.id.bt_connect);
        bt_close= (Button)this.findViewById(R.id.bt_close);
        edit_rq= (EditText)this.findViewById(R.id.edit_rq);
        edit_co= (EditText)this.findViewById(R.id.edit_co);
        edit_yj= (EditText)this.findViewById(R.id.edit_yj);

        bt_connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {  //放置连接按钮事件处理代码
                //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip

                ip=ip_edit.getText().toString().trim();

                //结束任务3_2

                port= Integer.parseInt(ip_port.getText().toString().trim());

                startThread();
            }
        });

        bt_close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {//放置关闭按钮事件处理代码
                try {
                    ss.close();
                    tv_state.setText("网络断开");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        });

    }

    void startThread()
    {
        new Thread(new Runnable() {
            @Override
            public void run() {

                try {
                    //任务3_3 ：实现建立Socket网络连接，使用变量ss保存

                    ss= new Socket(ip,port);


                    //结束任务3_3

                    //数据输入流DataInputStream
                    dataInputStream=new DataInputStream(ss.getInputStream());


                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态

                            tv_state.setText("已连接");

                            //结束任务3_4
                        }

                    });


                } catch (IOException e) {
                    e.printStackTrace();
                }

                while(true)
                {
                    try {
                        //网络接收数据，保存到buff
                        len=dataInputStream.read(buff);
                        //如果接收的数据不符合通信协议，即不符合上传数据的数据结构，放弃不做任何处理，等待接收下一个数据；
                        if(len!=6 || buff[0]!=(byte)0x55 || buff[1]!=(byte)0xAA )  continue;
                        //根据通信协议提取燃气浓度数据 ，温度数据保存到变量rq
                        if(buff[3]==(byte)0x28)
                        {
                            //正数
                            rq=0x0FF & buff[5]; //byte转换成int,部分编译器会把最高位当做符号位，因此写成0x0FF
                            //负数
                            if(buff[4]!=(byte)0x0){
                                rq=-1*rq;
                            }
                        }
                        //根据通信协议提取CO浓度数据 ，温度数据保存到变量co

                        //任务3_5 ：根据通信协议提取CO浓度值数据,CO浓度值数据保存到变量co

                        if(buff[3]==(byte)0x29)
                        {
                            //正数
                            co=0x0FF & buff[5]; //byte转换成int,部分编译器会把最高位当做符号位，因此写成0x0FF
                            //负数
                            if(buff[4]!=(byte)0x0){
                                co=-1*co;
                            }
                        }

                        //结束任务3_5

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            edit_rq.setText(""+rq);
                            edit_co.setText(""+co);

                            //任务3_6 ：实现显示可燃气体报警，报警显示编辑框是edit_yj
                            //没有超出报警阀值显示“正常”，超出报警阀值显示“危险”。假设可燃气体报警阀值设定为大于25% LEL报警。

                            if(rq>=25 || co>=25)
                            {
                                edit_yj.setText("危险");
                            }
                            else
                                edit_yj.setText("正常");


                            //结束任务3_6
                        }
                    });


                }



            }
        }).start();


    }



}